import 'dart:convert';
import 'dart:io';

import 'package:flutter/foundation.dart';
import 'package:crypto/crypto.dart';
import 'package:path_provider/path_provider.dart';

class FileCacheUtils {
  static Future<String> getTargetFilePath(String key) async {
    String dir = await _dir(key);
    return "$dir/${_fileName(key)}";
  }

  static Future<String> _dir(String key) async {
    String subPath = _hash(key).toString();
    Directory appDocDir = await getApplicationDocumentsDirectory();
    return "${appDocDir.path}/$subPath";
  }

  static int _hash(String key) {
    List<int> asciis = key.codeUnits;
    int sum = 0;
    for (final element in asciis) {
      sum += element;
    }
    int hash = sum % _maxFileDirCount;
    return hash;
  }

  // file name max length 255
  // key + md5(key)
  // key is unique
  static String _fileName(String key) {
    final byte = utf8.encode(key);
    final digest = md5.convert(byte);
    return digest.toString();
  }
}

// 默认最大20个文件夹
// PS:该值一旦设定不可变，除非删除既有文件缓存才可更改，否则老版本必然读写缓存错误
// PS:该值一旦设定不可变，除非删除既有文件缓存才可更改，否则老版本必然读写缓存错误
// PS:该值一旦设定不可变，除非删除既有文件缓存才可更改，否则老版本必然读写缓存错误
const _maxFileDirCount = 20;
